package com.zh.yqbj.controller;

import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.util.SaResult;
import cn.hutool.core.lang.tree.Tree;
import com.zh.yqbj.dto.SpaceDTO;
import com.zh.yqbj.entity.Space;
import com.zh.yqbj.service.SpaceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/space")
@Slf4j
public class SpaceController {
    @Autowired
    private SpaceService spaceService;

    /**
     * 获取用户所有空间和笔记
     *
     * @return 空间树
     */
    @GetMapping("/all")
    public SaResult getLoginUserSpaces() {
        List<Tree<String>> notes = spaceService.getLoginUserSpaces();
        SaResult saResult = new SaResult(200, null, notes);
        return saResult;
    }

    /**
     * 获取所有根空间
     *
     * @return
     */
    @GetMapping("/root")
    public SaResult getLoginUserRootSpaces() {
        List<Space> loginUserRootSpaces = spaceService.getLoginUserRootSpaces();
        SaResult saResult = new SaResult(200, null, loginUserRootSpaces);
        return saResult;
    }

    /**
     * 获取空间基本信息 可能会被取代
     * @param spaceId
     * @return
     */
    @GetMapping
    public SaResult getSpace(@RequestParam String spaceId){
        Space space = spaceService.getById(spaceId);
        return new SaResult(200,null,space);
    }
    @GetMapping("/info")
    public SaResult getSpaceInfo(@RequestParam String spaceId){
        List<Tree<String>> spaceInfo = spaceService.getSpaceTree(spaceId);
        return new SaResult(200,null,spaceInfo);
    }
    /**
     * 新建空间，必须有父空间id
     * 关联用户
     *
     * @return
     */
    @PostMapping
    @SaCheckLogin
    public SaResult addSpace(@RequestBody Space space) {
        spaceService.saveSpaceWithUser(space);
        return SaResult.ok("新建空间成功");
    }

    /**
     * 更新空间信息，包括名称和描述，父空间id，以及空间下的笔记
     * 笔记与空间绑定
     *
     * @param spaceDTO spaceDTO
     * @return
     */
    @PutMapping
    @SaCheckLogin
    public SaResult updateSpace(@RequestBody SpaceDTO spaceDTO) {
        spaceService.updateSpace(spaceDTO);
        return SaResult.ok("更新成功");
    }

    /**
     * 删除空间，空间下有笔记则一并删除 status 0 - 1
     * 为逻辑删除，空间状态为已删除则不会显示在用户空间列表中
     *
     * @param spaceId
     * @return
     */
    @SaCheckLogin
    @DeleteMapping("/delete")
    public SaResult deleteSpace(@RequestParam String spaceId) {
        spaceService.deleteSpace(spaceId);
        return SaResult.ok("删除空间成功");
    }

    /**
     * 恢复空间，status 1 - 0
     *
     * @param spaceId
     * @return
     */
    @SaCheckLogin
    @PutMapping("/recycle")
    public SaResult recycleSpace(@RequestParam String spaceId) {
        spaceService.recycleSpace(spaceId);
        return SaResult.ok("回收空间成功");
    }

    /**
     * 彻底删除空间， status 1 - 2
     *
     * @param spaceId
     * @return
     */
    @SaCheckLogin
    @DeleteMapping("/remove")
    public SaResult removeSpace(@RequestParam String spaceId) {
        spaceService.removeSpace(spaceId);
        return SaResult.ok("彻底珊删除空间");
    }
}
